﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanLyHocPhi.Model;
using QuanLyHocPhi.BLL;
using System.Diagnostics;
using System.IO;
using System.Threading;
using QuanLyHocPhi.GUI.DuLieu;

namespace QuanLyHocPhi.GUI.TacNghiep
{
    public partial class FormThuLeHocPhiLop : Form
    {
        bool lockUpdate = false;
        bool LaHocPhi = true;
        int timeSleep = Properties.Settings.Default.TimeSleep;
        string fileName = "";
        string fileLuu = string.Format("{0}\\Documents\\TEMPLATES\\PhieuThu.xml",
               Application.StartupPath);
        string fileIn = string.Format("{0}\\Documents\\TEMPLATES\\PhieuThu.doc",
               Application.StartupPath);
        public FormThuLeHocPhiLop(bool laHocPhi = true)
        {
            InitializeComponent();
            this.LaHocPhi = laHocPhi;
            if (LaHocPhi)
            {
                lbLeHocPhi.Text = "Học phí";
                this.Text = lbTieuDe.Text = "Thu học phí theo lớp";
                fileName = string.Format("{0}\\Documents\\TEMPLATES\\MauThuHocPhi.xml",
               Application.StartupPath);
            }
            else
            {
                lbLeHocPhi.Text = "Lệ phí";
                this.Text = lbTieuDe.Text = "Thu lệ phí theo lớp";
                fileName = string.Format("{0}\\Documents\\TEMPLATES\\MauThuLePhi.xml",
              Application.StartupPath);
            }
            gridDSNopHocPhi.AllowDrop = false;
            gridDSNopHocPhi.AllowUserToAddRows = false;
            gridDSNopHocPhi.AllowUserToDeleteRows = false;
            gridDSNopHocPhi.AutoGenerateColumns = false;
            colMaSV.DataPropertyName = "MaSinhVien";
            colHoDem.DataPropertyName = "HoDem";
            colTen.DataPropertyName = "Ten";
            colNgaySinh.DataPropertyName = "NgaySinh";
            colTrangThai.DataPropertyName = "SoTienDaNopStr";
            colChon.DataPropertyName = "DaChon";
            LoadNamHoc();
            //LoadLoaiHinh();
            LoadLopGoc();
        }

        private void InitComboSuggestion(ComboBox cmb, object datasource, string displayMember, string valueMember, string[] rangeDisplay)
        {
            cmb.AutoCompleteSource = AutoCompleteSource.CustomSource;
            cmb.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            cmb.DataSource = datasource;
            if (displayMember != null)
                cmb.DisplayMember = displayMember;
            if (valueMember != null)
                cmb.ValueMember = valueMember;
            // Xác định AutoCompleteCustomeSource
            var autoCompletSet = new AutoCompleteStringCollection();
            autoCompletSet.AddRange(rangeDisplay);
            cmb.AutoCompleteCustomSource = autoCompletSet;

            // Các tinh chỉnh nâng cao
            cmb.Leave += (oSender, oE) =>
            {
                var cbx = oSender as ComboBox;
                if (cbx == null)
                    return;
                cbx.BackColor = cbx.SelectedItem == null ? Color.LightPink : SystemColors.Window;
            };

            cmb.KeyDown += (oSender, oE) =>
            {
                if (oE.KeyCode != Keys.Enter)
                    return;
                var cbx = oSender as ComboBox;
                if (cbx == null)
                    return;
                cbx.BackColor = cbx.SelectedItem == null ? Color.LightPink : SystemColors.Window;
            };
        }

        private void LoadLoaiHinh()
        {
            lockUpdate = true;
            var ds = BizLoaiHinhDaoTao.GetListLoaiHinh();
            InitComboSuggestion(cmbLoaiHinh, ds, "TenLoaiHinh", "MaLoaiHinh", ds.Select(e => e.TenLoaiHinh).ToArray());
            //cmbLoaiHinh.DataSource = ds;
            //cmbLoaiHinh.DisplayMember = "TenLoaiHinh";
            //cmbLoaiHinh.ValueMember = "MaLoaiHinh";
            lockUpdate = false;
            LoadNamTuyenSinh();
        }

        private void LoadLopGoc()
        {
            lockUpdate = true;
            cmbLop.DataSource = null;
            var ds = new List<LopGoc>();
            FormProgress frm = new FormProgress();
            frm.DoWork += delegate(object oSender, DoWorkEventArgs oE)
            {
                ds = BizLopGoc.GetListLopGoc();
            };
            #region On complete
            frm.RunWorkerCompleted += delegate(object oSender, RunWorkerCompletedEventArgs oE)
            {
                if (oE.Error != null)
                {
                    string msg = oE.Error.Message;
                    if (oE.Error.InnerException != null)
                        msg += oE.Error.InnerException.Message;
                    DialogUtils.ShowError(msg);
                }

            };
            #endregion

            frm.StartWorking(this);
            InitComboSuggestion(cmbLop, ds, "TenLopGoc", "MaLopGoc", ds.Select(e => e.TenLopGoc).ToArray());
            //cmbLop.DataSource = ds;
            //cmbLop.DisplayMember = "TenLopGoc";
            //cmbLop.ValueMember = "MaLopGoc";
            lockUpdate = false;
            cmbLop_SelectedIndexChanged(this, new EventArgs());
        }

        private void LoadNamHoc()
        {
            lockUpdate = true;
            var ds = BizNamHoc.GetListNamHoc();
            InitComboSuggestion(cmbNamHoc, ds, "TenNamHoc", "TenNamHoc", ds.Select(e => e.TenNamHoc).ToArray());
            //cmbNamHoc.ValueMember = "TenNamHoc";
            //cmbNamHoc.DisplayMember = "TenNamHoc";
            //cmbNamHoc.DataSource = ds;
            lockUpdate = false;
            LoadHocKy();
            #region Commented
            //List<string> ls = new List<string>();
            //for (int i = 0; i < ds.Count; i++)
            //{
            //    string item = ds[i].TenNamHoc;
            //    ls.Add(item);
            //}
            //cmbNamHoc.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            //cmbNamHoc.AutoCompleteSource = AutoCompleteSource.ListItems; 
            #endregion
        }

        private void LoadHocKy()
        {
            lockUpdate = true;
            cmbHocKy.DataSource = null;
            if ((cmbNamHoc.SelectedItem as NamHoc) != null)
            {
                var ds = BizHocKy.GetList_HocKy((cmbNamHoc.SelectedItem as NamHoc).TenNamHoc);
                cmbHocKy.DataSource = ds;
                cmbHocKy.DisplayMember = "TenHocKy";
                cmbHocKy.ValueMember = "MaHocKy";
                lockUpdate = false;
                LoadLeHocPhi();
                LoadNoiDungLeHocPhi();
            }
        }

        private void LoadLeHocPhi()
        {
            if (cmbHocKy.SelectedIndex != -1 && cmbLop.SelectedIndex != -1)
            {
                var lhp = BizPhiMacDinh.GetLeHocPhi((cmbLop.SelectedItem as LopGoc).MaLopGoc, (cmbHocKy.SelectedItem as HocKy).MaHocKy, LaHocPhi);
                txtHocPhi.Text = lhp.ToString();
                txtSoTienNop.Text = lhp.ToString();
            }
            else
            {
                txtHocPhi.Text = "";
                txtSoTienNop.Text = "";
            }
        }

        private void LoadDanhSachSinhVien()
        {
            lockUpdate = true;
            bdsDsSinhVien.DataSource = null;
            gridDSNopHocPhi.DataSource = bdsDsSinhVien;
            if (cmbLop.SelectedIndex != -1)
            {
                var ds = BizSinhVien.GetDanhSachSinhVien((cmbLop.SelectedItem as LopGoc).MaLopGoc, (cmbHocKy.SelectedItem as HocKy).MaHocKy, LaHocPhi);
                bdsDsSinhVien.DataSource = ds;
                gridDSNopHocPhi.DataSource = bdsDsSinhVien;
            }
            lockUpdate = false;
        }

        private void LoadNamTuyenSinh()
        {
            lockUpdate = true;
            cmbNamTuyenSinh.DataSource = null;
            var ds = BizLoaiHinhDaoTao.GetList_NamTuyenSinh((cmbLoaiHinh.SelectedItem as LoaiHinhDaoTao).MaLoaiHinh);
            InitComboSuggestion(cmbNamTuyenSinh, ds, null, null, ds.ToArray());
            //cmbNamTuyenSinh.DataSource = ds;
            lockUpdate = false;
            LoadLopGoc();
        }

        private void LoadNoiDungLeHocPhi()
        {
            txtNoiDungThu.Text = "";
            if (cmbNamHoc.SelectedIndex != -1 && cmbHocKy.SelectedIndex != -1)
            {
                var hk = cmbHocKy.SelectedItem as HocKy;
                var nh = cmbNamHoc.SelectedItem as NamHoc;
                txtNoiDungThu.Text = string.Format("{2} học kỳ {0} năm học {1}", hk.TenHocKy, nh.TenNamHoc, LaHocPhi ? "Học phí" : "Lệ phí");
            }
        }

        private void cmbNamHoc_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!lockUpdate)
            {
                LoadHocKy();
            }
        }

        private void cmbLoaiHinh_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!lockUpdate)
            {
                LoadNamTuyenSinh();
            }
        }

        private void cmbHocKy_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!lockUpdate)
            {
                LoadLeHocPhi();
                LoadDanhSachSinhVien();
                LoadNoiDungLeHocPhi();
            }
        }

        private void cmbLop_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!lockUpdate)
            {
                LopGoc lop = cmbLop.SelectedItem as LopGoc;
                if (lop != null)
                {
                    txtLoaiHinh.Text = lop.LoaiHinhDaoTao.TenLoaiHinh;
                    txtNTS.Text = lop.NamTuyenSinh;
                    LoadLeHocPhi();
                    LoadDanhSachSinhVien();
                }
            }
        }

        private void cmbNamTuyenSinh_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!lockUpdate)
            {
                LoadLopGoc();
            }
        }

        private void lnkChon_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {

        }

        private void bntNhap_Click(object sender, EventArgs e)
        {
            NhapDSPhieuThuVaoCSDL();
        }

        /// <summary>
        /// Nhập danh sách phiếu thu
        /// </summary>
        /// <param name="inPhieuThu">True: In phiếu; False: không in phiếu</param>
        void NhapDSPhieuThuVaoCSDL(bool inPhieuThu = false)
        {
            gridDSNopHocPhi.EndEdit();

            #region Tiến xử lý
            if (cmbHocKy.SelectedIndex == -1)
                return;
            var hocKy = cmbHocKy.SelectedItem as HocKy;
            #endregion

            #region Lấy danh sách mã sinh viên được chọn
            List<string> dsMSV = new List<string>();
            var dsSV = bdsDsSinhVien.DataSource as List<CustomSinhVien>;
            foreach (var item in dsSV)
                if (item.DaChon)
                    dsMSV.Add(item.MaSinhVien);
            #endregion

            #region Lấy học phí
            int sHocPhi = 0;
            int temp = 0;
            var soTien = txtHocPhi.Text.Replace(".", "").Replace(",", "");
            if (int.TryParse(soTien, out temp))
                sHocPhi = int.Parse(soTien);
            else
            {
                DialogUtils.ShowError("Nhập sai học phí");
                return;
            }
            int sSoTienNop = 0;
            soTien = txtSoTienNop.Text.Replace(".", "").Replace(",", "");
            if (int.TryParse(soTien, out temp))
                sSoTienNop = int.Parse(soTien);
            else
            {
                DialogUtils.ShowError("Nhập sai số tiền cần nộp");
                return;
            }
            #endregion

            #region Lấy thông tin về số biên lai
            List<int> cauHinhBienLai = BizCauHinh.GetCauHinh(LaHocPhi);
            var quyenSo = 1;
            var soPhieu = 1;
            if (cauHinhBienLai != null)
            {
                quyenSo = cauHinhBienLai[0];
                soPhieu = cauHinhBienLai[1];
            }
            #endregion

            #region Duyệt qua mỗi sinh viên được chọn và tiến hành biên chế sinh viên vào học kỳ và lập phiếu thu
            foreach (var msv in dsMSV)
            {
                //Biên chế sinh viên vào một một học kỳ
                BienCheSinhVienVaoHocKy bienChe = null;//;BizBienCheSinhVienVaoHocKy.BienCheSinhVien(msv, hocKy.MaHocKy, sHocPhi,, LaHocPhi);
                //Tạo mới một phiếu thu
                var phieuThu = new PhieuThu()
                {
                    MaPhieuThu = Guid.NewGuid().ToString(),
                    SoQuyen = quyenSo.ToString(),
                    SoPhieu = soPhieu.ToString(),
                    NoiDungThu = txtNoiDungThu.Text,
                    NgayThu = dateNgayNop.Value.Date,
                    MaBienChe = bienChe.MaBienChe,
                    MaNguoiThu = Program.NguoiSuDung.TenDangNhap,
                    SoTien = sSoTienNop,
                    DaIn = false
                };
                if (LaHocPhi)
                    phieuThu.LaHocPhi = true;
                else
                    phieuThu.LaHocPhi = false;
                if (inPhieuThu)
                {
                    phieuThu.SoPhieu = soPhieu.ToString();
                    phieuThu.SoQuyen = quyenSo.ToString();
                }
                #region Tạo mới phiếu thu, cập nhật số biên lai và in phiếu thu
                if (BizPhieuThu.CreatePhieuThu(phieuThu))
                {
                    if (inPhieuThu)
                    {
                        //Mã in từng phiếu thu được viết tại đây
                        InPhieuThu(phieuThu.MaPhieuThu);
                        //Tăng số phiếu và số quyển

                    }
                }
                BizCauHinh.IncrementCauHinh(ref quyenSo, ref soPhieu);
                BizCauHinh.UpdateCauHinh(quyenSo.ToString(), soPhieu.ToString(), LaHocPhi);
                #endregion
            }
            #endregion

            #region Kết thúc quá trình lập phiếu thu
            //if (inPhieuThu)
            //{
            //    //Cập nhật lại số biên lai
            //    BizCauHinh.UpdateCauHinh(quyenSo, soPhieu, tongSoPhieu, soPhieuLonNhat, LaHocPhi);
            //}
            DialogUtils.ShowMessage("Đã lập phiếu thu cho " + dsMSV.Count + " sinh viên");
            //Làm mới lại danh sách sinh viên đã nộp
            LoadDanhSachSinhVien();
            #endregion
        }

        /// <summary>
        /// In phiếu thu
        /// </summary>
        /// <param name="phieuThu"></param>
        private void InPhieuThu(string maPhieuThu)
        {
            try
            {
                if (!File.Exists(fileName))
                {
                    DialogUtils.ShowMessage("File mẫu phiếu thu không tồn tại. Xin vui lòng kiểm tra lại hoặc liên hệ với người quản trị");
                    return;
                }
                if (File.Exists(fileLuu))
                    File.Delete(fileLuu);
                if (File.Exists(fileIn))
                    File.Delete(fileIn);
                var pt = BizPhieuThu.GetPhieuThuFull(maPhieuThu);

                String fileContents = System.IO.File.ReadAllText(fileName);
                fileContents = fileContents.Replace("{ngay}", pt.NgayThu.Day.ToString());
                fileContents = fileContents.Replace("{thang}", pt.NgayThu.Month.ToString());
                fileContents = fileContents.Replace("{nam}", pt.NgayThu.Year.ToString());
                fileContents = fileContents.Replace("{quyenSo}", pt.SoQuyen);
                fileContents = fileContents.Replace("{soPhieu}", pt.SoPhieu);
                fileContents = fileContents.Replace("{tenSinhVien}", pt.BienCheSinhVienVaoHocKy.SinhVien.HoDem + " " + pt.BienCheSinhVienVaoHocKy.SinhVien.Ten);
                fileContents = fileContents.Replace("{diaChi}", pt.BienCheSinhVienVaoHocKy.SinhVien.LopGoc.TenLopGoc);
                fileContents = fileContents.Replace("{noiDung}", pt.NoiDungThu);
                fileContents = fileContents.Replace("{soTien}", pt.SoTien.ToString().FormatCurrency());
                fileContents = fileContents.Replace("{soTienBangChu}", pt.SoTien.ToString().ConvertNum2Text());
                fileContents = fileContents.Replace("{nguoiThu}", pt.NguoiSuDung.HoTen);
                fileContents = fileContents.Replace("{banSao}", "");

                System.IO.File.WriteAllText(fileLuu, fileContents);
                File.Move(fileLuu, fileIn);
                ProcessStartInfo info = new ProcessStartInfo(fileIn);
                info.Verb = "Print";
                info.CreateNoWindow = true;
                info.WindowStyle = ProcessWindowStyle.Hidden;
                Process process = Process.Start(info);
                //Đợi tiến trình in thực hiện trong 10 giây. Nếu có lỗi thì thoát
                if (!process.WaitForExit(timeSleep))
                {
                    process.Kill();
                    return;
                }
                //Nếu in thành công thì cập nhật trạng thái phiếu thu
                pt.DaIn = true;
                BizPhieuThu.Update(pt);
            }
            catch (Exception ex)
            {
                DialogUtils.ShowError("Lỗi: " + ex.ToString());
            }
        }

        private void txtHocPhi_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), "\\d+"))
            {
                e.Handled = true;
            }
        }

        private void txtSoTienNop_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), "\\d+"))
            {
                e.Handled = true;
            }
        }

        private void bntNhapVaIn_Click(object sender, EventArgs e)
        {
            NhapDSPhieuThuVaoCSDL(true);
        }

        private void bdsDsSinhVien_DataSourceChanged(object sender, EventArgs e)
        {
            if (bdsDsSinhVien.DataSource != null)
            {
                bntNhap.Enabled = true;
                bntNhapVaIn.Enabled = true;
            }
            else
            {
                bntNhap.Enabled = false;
                bntNhapVaIn.Enabled = false;
            }
        }

        private void bntChonTatCa_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < gridDSNopHocPhi.RowCount; i++)
            {
                gridDSNopHocPhi.Rows[i].Cells[0].Value = (bool)gridDSNopHocPhi.Rows[i].Cells[0].Value == true ? false : true;
            }
        }

        private void txtHocPhi_TextChanged(object sender, EventArgs e)
        {
            int temp = 0;
            var hocPhi = txtHocPhi.Text.Replace(".", "").Replace(",", "");
            if (int.TryParse(hocPhi, out temp))
            {
                txtHocPhi.Text = hocPhi.FormatCurrency();
                txtHocPhi.Select(txtHocPhi.Text.Length, 0);
            }
        }

        private void txtSoTienNop_TextChanged(object sender, EventArgs e)
        {
            int temp = 0;
            var soTienNop = txtSoTienNop.Text.Replace(".", "").Replace(",", "");
            if (int.TryParse(soTienNop, out temp))
            {

                lbTienBangChu.Text = int.Parse(soTienNop).ToString().ConvertNum2Text();
                txtSoTienNop.Text = soTienNop.FormatCurrency();
                txtSoTienNop.Select(txtSoTienNop.Text.Length, 0);
            }
        }
    }
}
